package br.gov.ibama.client.visao.aluno;

import java.util.ArrayList;
import java.util.List;

import br.gov.ibama.client.componentes.BasisComponentes;
import br.gov.ibama.client.componentes.PopUpBasis;
import br.gov.ibama.client.constantes.ConstantesDS;
import br.gov.ibama.client.constantes.ConstantesFields;

import com.smartgwt.client.data.DSCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.rpc.RPCResponse;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.ImgButton;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.TextItem;

public class VisaoPopupAluno extends PopUpBasis{

	public VisaoPopupAluno(String title) {
		super (title);
	}

	public VisaoPopupAluno (String title, int estado){
		super(title, estado);
	}

	protected List<ImgButton> getBotoes (){
		List<ImgButton> listaBotoes = new ArrayList<ImgButton>();
		listaBotoes.add(getBotaoSalvar());
		listaBotoes.add(getBotaoCancelar());
		return listaBotoes;
	}

	private ImgButton getBotaoSalvar(){
		ImgButton Salvar = BasisComponentes.criaImgButton("Salvar", "salvar_32x32.png");
		Salvar.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				if(validaCampos()){
					Record record = formulario.getValuesAsRecord();
					
					if(getEstado() == PopUpBasis.ESTADO_EDITAR){
						DataSource.get(ConstantesDS.DS_ALUNO).updateData(record,new CallBackSalvarEditar());
					}	
					else if(getEstado() == PopUpBasis.ESTADO_SALVAR){
						DataSource.get(ConstantesDS.DS_ALUNO).addData(record,new CallBackSalvarEditar());
					}
				}
			}
		});
		return Salvar;
	}

	private ImgButton getBotaoCancelar(){
		ImgButton Cancelar = BasisComponentes.criaImgButton("Cancelar", "cancelar_32x32.png");
		Cancelar.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				destroy();

			}
		});
		return Cancelar;
	}

	public void criaFormulario(){
		preparaFormulario(ConstantesDS.DS_ALUNO, getListaCamposFormulario());
	}
	public FormItem[] getListaCamposFormulario(){
		return getCamposFormulario().toArray(new FormItem[getCamposFormulario().size()]);
	}

	private List<FormItem> getCamposFormulario(){
		List<FormItem> listaCampos = new ArrayList<FormItem>();

		TextItem codigoAluno = BasisComponentes.criaTextItemPequeno(ConstantesFields.FIELD_ALUNO_ID);
		codigoAluno.setCanEdit(false);
		listaCampos.add(codigoAluno);

		TextItem matricula = BasisComponentes.criaTextItemRequeridoPequeno(ConstantesFields.FIELD_ALUNO_MATRICULA, "Matrícula");
		listaCampos.add(matricula);


		TextItem nome = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ALUNO_NOME, "Nome");
		listaCampos.add(nome);

		TextItem nomePai = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ALUNO_NOME_PAI, "Pai");
		listaCampos.add(nomePai);

		TextItem nomeMae = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ALUNO_NOME_MAE, "Mãe");
		listaCampos.add(nomeMae);

		TextItem logradouro = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ENDERECO_LOGRADOURO, "Logradouro");
		listaCampos.add(logradouro);

		TextItem bairro = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ENDERECO_BAIRRO, "Bairro");
		listaCampos.add(bairro);

		TextItem numero = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ENDERECO_NUMERO, "Número");
		listaCampos.add(numero);

		//TODO COLOCAR COMBOBOX
		TextItem cidade = BasisComponentes.criaComboboxObrigatorioGrande(ConstantesFields.FIELD_CIDADE_ID, "Cidade");
		cidade.setOptionDataSource(DataSource.get(ConstantesDS.DS_CIDADE));
		cidade.setDisplayField(ConstantesFields.FIELD_CIDADE_NOME);
		cidade.setValueField(ConstantesFields.FIELD_CIDADE_ID);
		listaCampos.add(cidade);

		TextItem cep = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ENDERECO_CEP, "CEP");
		listaCampos.add(cep);

		TextItem pontoReferencia = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ENDERECO_PONTO_REFERENCIA, "Ponto De Referência");
		listaCampos.add(pontoReferencia);

		return listaCampos;


	}

	private final class CallBackSalvarEditar implements DSCallback {
		@Override
		public void execute(DSResponse response, Object rawData, DSRequest request) {
			if (RPCResponse.STATUS_SUCCESS == response.getStatus()) {
				if(getEstado() == PopUpBasis.ESTADO_SALVAR){
					SC.say("Incluído com sucesso");
					destroy();
				}
				else if(getEstado() == PopUpBasis.ESTADO_EDITAR){
					SC.say("Alterado com sucesso");
					destroy();
				}				
			} else if (RPCResponse.STATUS_VALIDATION_ERROR == response.getStatus()) {
				formulario.setErrors(response.getErrors(), true);
				SC.say("Existem erros de validação, por favor verificar os dados informados.");
			} else if (RPCResponse.STATUS_FAILURE == response.getStatus()) {
				SC.say("Falha ao executar a operação.");
			}
		}
	}

	private boolean validaCampos() {
		FormItem matricula = getFormulario().getItem(ConstantesFields.FIELD_ALUNO_MATRICULA);
		FormItem nome = getFormulario().getItem(ConstantesFields.FIELD_ALUNO_NOME);
		FormItem logradouro = getFormulario().getItem(ConstantesFields.FIELD_ENDERECO_LOGRADOURO);
		FormItem cidade = getFormulario().getItem(ConstantesFields.FIELD_ENDERECO_CIDADE_ID);

		// Verifica preenchimento dos campos obrigatórios
		if (isVazio(matricula) || isVazio(nome) || isVazio(logradouro) || isVazio(cidade)) {
			SC.warn("Há campos obrigatórios não preenchidos.");
			return false;
		}

		return true;
	}
}

